package br.unirio.leilao.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.unirio.leilao.entity.Estilo;

public class EstiloDAO {

	private Connection connection;
	private static EstiloDAO instance;

	/**
	 * abre conex�o com o banco
	 */
	public EstiloDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	/**
	 * Retorna a inst�ncia �nica da classe
	 * @return
	 */
	public static EstiloDAO getInstance()
	{
		if (instance == null)
			instance = new EstiloDAO();
		
		return instance;
	}
	/**
	 * retorna a lista de todos os estilos de n�vel 0.
	 * @return List<Estilo>
	 */
	
	public List<Estilo> getListaEstilosNivel0() {
		
		try {
			List<Estilo> estilosNivel0 = new ArrayList<Estilo>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from estilo where IDSuperEstilo is null");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				Estilo estilo = new Estilo();
				estilo.setId(rs.getInt("ID"));
				estilo.setNome(rs.getString("Nome"));
				estilo.setSuperEstilo(null);

				estilosNivel0.add(estilo);
			}
			rs.close();
			stmt.close();
			return estilosNivel0;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * retorna a lista de estilos que est�o um n�vel abaixo do estilo passado.
	 * @param estiloNivel
	 * @return
	 */
	public List<Estilo> getListaEstilosNivelInferior(Estilo estiloNivel) {
		
		try {
			List<Estilo> estilosNivel1 = new ArrayList<Estilo>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from estilo where IDSuperEstilo = ?");
			stmt.setInt(1, estiloNivel.getId());
			ResultSet rs = stmt.executeQuery();
						
			while (rs.next()) {
				
				Estilo estilo = new Estilo();
				estilo.setId(rs.getInt("ID"));
				estilo.setNome(rs.getString("Nome"));
				estilo.setSuperEstilo(estiloNivel);

				estilosNivel1.add(estilo);
			}
			rs.close();
			stmt.close();
			if(estilosNivel1.size() == 0) {
				return null;
			}
			return estilosNivel1;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * retorna a lista de todos os estilos de nivel 1.
	 * @return
	 */
	public List<Estilo> getListaEstilosNivel1() {
		
		List<Estilo> estilosNivel1 = new ArrayList<Estilo>();
		
		for(Estilo estiloNivel0 : getListaEstilosNivel0()){
			List<Estilo> estilos = getListaEstilosNivelInferior(estiloNivel0);
			if(estilos != null) {
				estilosNivel1.addAll(estilos);
			}
		}
		
		return estilosNivel1;
	}
	
}
